//
//  ZHNetworkingManager.h
//  ToolsEnginer
//
//  Created by 正合适 on 2017/6/2.
//  Copyright © 2017年 正合适. All rights reserved.
//  网络库封装

#import <Foundation/Foundation.h>
#import "ZHNetworkingConfiguration.h"


/**
 url主域名

 - Url_Formal: 正式域名
 - Url_Debug: 测试域名
 */
typedef NS_ENUM(NSUInteger, RequestUrlType) {
    Url_Formal,
    Url_Debug,
};

/**
 网络类型

 - NetworkingStatusUnknown:         未知网络
 - NetworkingStatusNotReachable:    没有网络
 - NetworkingStatusViaWWAN:         手机网络
 - NetworkingStatusViaWiFi:         Wifi网络
 */
typedef NS_ENUM(NSUInteger, NetworkingStatus) {
    NetworkingStatusUnknown         = 1,
    NetworkingStatusNotReachable    = 2,
    NetworkingStatusViaWWAN         = 3,
    NetworkingStatusViaWiFi         = 4,
};

// 成功回调Block
typedef void(^SuccessBlock)(id responseObj);
// 失败回调Block
typedef void(^ErorrBlock)(id responseObj);
// 缓存回调Block
typedef void(^CacheBlock)(id cacheObj);
// 网络状态变化
typedef void(^NetworkingStatusBlock)(NetworkingStatus);

@interface ZHNetworkingManager : NSObject

/**成功回调Block*/
@property (nonatomic, copy) SuccessBlock successBlock;
/**失败回调Block*/
@property (nonatomic, copy) ErorrBlock errorBlock;
/**缓存回调*/
@property (nonatomic, copy) CacheBlock cacheBlock;
/**<#desc#>*/
@property (nonatomic, assign) id<ZHNetworkingConfiguration> configuration;


/**
 单例初始化

 @return <#return value description#>
 */
+ (instancetype)instance;

#pragma mark - ---------- 网络请求接口 ----------
/**
 【GET】文本数据请求-使用缓存

 @param url 请求链接
 @param params 参数
 @param cacheDays 缓存时间（天）0表示永久缓存 <0表示不缓存 >0表示用户自定义缓存时间
 @param cacheKey 缓存key 每一个请求方法key唯一
 @param successBlock 成功回调
 @param errorBlock 失败回调
 @param cacheBlock 缓存回调
 */
+ (void)get:(NSString *)url params:(NSDictionary *)params cacheTimeOut:(float)cacheDays cacheKey:(NSString *)cacheKey success:(SuccessBlock)successBlock error:(ErorrBlock)errorBlock cache:(CacheBlock)cacheBlock;

/**
 【GET】文本数据请求-不使用缓存

 @param url 请求链接
 @param params 参数
 @param successBlock 成功回调
 @param errorBlock 失败回调
 */
+ (void)get:(NSString *)url params:(NSDictionary *)params success:(SuccessBlock)successBlock error:(ErorrBlock)errorBlock;

/**
 【POST】文本数据请求-使用缓存

 @param url 请求链接
 @param params 参数
 @param cacheDays 缓存时间（天）0表示永久缓存 <0表示不缓存 >0表示用户自定义缓存时间
 @param cacheKey 缓存key 每一个请求方法key唯一
 @param successBlock 成功回调
 @param errorBlock 失败回调
 @param cacheBlock 缓存回调
 */
+ (void)post:(NSString *)url params:(NSDictionary *)params cacheTimeOut:(float)cacheDays cacheKey:(NSString *)cacheKey success:(SuccessBlock)successBlock error:(ErorrBlock)errorBlock cache:(CacheBlock)cacheBlock;

/**
 【POST】文本数据请求-不使用缓存

 @param url 请求链接
 @param params 参数
 @param successBlock 成功回调
 @param errorBlock 失败回调
 */
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(SuccessBlock)successBlock error:(ErorrBlock)errorBlock;

/**
 【PUT】文本数据请求-不使用缓存

 @param url <#url description#>
 @param params <#params description#>
 @param successBlock <#successBlock description#>
 @param errorBlock <#errorBlock description#>
 */
+ (void)put:(NSString *)url params:(NSDictionary *)params success:(SuccessBlock)successBlock error:(ErorrBlock)errorBlock;

#pragma mark - ---------- 网络状态接口 ----------
/**
 网络状态监听开启和关闭
 
 @param start YES:开启网络状态监听  NO:关闭网络状态监听
 */
+ (void)networkingStatusObserver:(BOOL)start;

/**
 网络状态变化,需先开启网络监听
 
 @param networkingStatusBlock 网络状态变化的block
 */
+ (void)networkingChangeStatus:(NetworkingStatusBlock)networkingStatusBlock;

/**
 网络是否可用 手机及wifi
 
 @return YES:可用
 */
+ (BOOL)isNetReachable;

/**
 wifi是否可用
 
 @return YES:可用
 */
+ (BOOL)isWifiReachable;

/**
 手机网络是否可用
 
 @return YES:可用
 */
+ (BOOL)isViaWWANReachable;

@end
